package com.xzzz.irda.auth.server.authentication;

import com.xzzz.irda.auth.core.authorization.Authorization;
import com.xzzz.irda.auth.core.constants.GrantTypeEnum;
import com.xzzz.irda.auth.server.pojo.LoginMetadata;
import com.xzzz.irda.auth.server.service.UserDetail;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 授权处理策略类, 不要使用该类直接调用方法, 该类并没有调用抽象类的构造方法,即 super, 所以无法直接调用其他方法
 *
 * @author wangyf
 * 
 * @since 1.1.0 增加刷新token方法
 */
@Slf4j
public class AuthenticationManagerStrategy extends AbstractAuthenticationManager {

    /**
     * 存放处理类的map, 不实用枚举做key, 因为接口传入参数为String
     */
    private final Map<String, AuthenticationManager> managerMap = new HashMap<>(GrantTypeEnum.values().length);

    /**
     * 策略类构造方法, 注入所有 {@link AuthenticationManager} 的实现类
     * 通过实现的 {@link AuthenticationManager#getGrantType()} 方法作为 key 组成 map
     *
     * @param authenticationManagerList AuthorizationManager实现类集合
     */
    public AuthenticationManagerStrategy(List<AuthenticationManager> authenticationManagerList) {
        for (AuthenticationManager authenticationManager : authenticationManagerList) {
            managerMap.put(authenticationManager.getGrantType(), authenticationManager);
        }
    }

    /**
     * 构造授权信息
     *
     * @param authorization 授权信息
     * @param loginMetadata 登录请求参数
     * @return 授权主体
     */
    @Override
    public Authorization build(Authorization authorization, LoginMetadata loginMetadata) {
        return managerMap.get(authorization.getGrantType()).build(authorization, loginMetadata);
    }

    @Override
    public UserDetail findUser(Authorization authorization, LoginMetadata loginMetadata) {
        return null;
    }

    /**
     * 刷新授权信息,根据用户ID刷新
     *
     * @param token 授权主体的Key,即token
     */
    @Override
    public void refreshAuthorization(String token) {
        managerMap.get(GrantTypeEnum.INNER.getType()).refreshAuthorization(token);
    }

    /**
     * 删除授权信息
     *
     * @param key 授权主体的key
     */
    @Override
    public void removeAuthorization(String key) {
        managerMap.get(GrantTypeEnum.PASSWORD.getType()).removeAuthorization(key);
    }

    /**
     * 查询各类实现相同
     *
     * @param token 授权主体key
     * @return 授权主体
     */
    @Override
    public Authorization getAuthorization(String token) {
        return managerMap.get(GrantTypeEnum.PASSWORD.getType()).getAuthorization(token);
    }
}
